home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #6 / Amiga Plus CD - 2004 - No. 06.iso / AmiSoft / Comm / tcp / AmiMSN.lha / AmiMSN-IM.rexx < prev    next >
OS/2 REXX Batch file  |  2004-05-28  |  5KB  |  199 lines

  1. /* AmiMSN Instant Message 0.2 */
  2. Signal On Syntax
  3. Parse Arg Num" "SessID" "ServR":"PortN" "ChlgC" "Email" "IMNick" "RandNum
  4. CR="D0A"x;TrID="1"
  5.  
  6. IF Left(RandNum,1)~="R" THEN DO
  7.  IRCd="1"
  8.  IF Num="2" THEN DO
  9.   Call Open(PIPE2,"PIPE:AmiMSN"RandNum".tmp","W")
  10.   Call Close(PIPE2)
  11.  End
  12.  Call Open(PIPE2,"PIPE:AmiMSN"RandNum".tmp","R")
  13. End
  14.  
  15. IF Num="1" THEN Call Say("Starting a conversation, please wait..",1)
  16. ELSE Call Say("Joining a conversation, please wait..",1)
  17. Sock=Socket("INET","STREAM")
  18. SIN.addraddr=Resolve(ServR)
  19. SIN.addrport=PortN
  20. IF Connect(Sock,"SIN")<0 THEN Call ErrMsg("Unable to connect to switchboard server.")
  21. Call IoCtlSocket(Sock,"FIONBIO",1)
  22. IF Num="1" THEN Call Send2("USR "TrID Email ChlgC)
  23. ELSE Call Send2("ANS "TrID Email ChlgC SessID)
  24. IF Num="1" THEN WFor="USR 1 OK"
  25. ELSE WFor="ANS 1 OK"
  26. DO UNTIL Left(Out,Length(WFor))=WFor
  27.  Call Recv2()
  28.  IF W1="IRO" THEN Call Say(RemHex(W6,3) "is participating in this conversation",1)
  29. End
  30. Call Say("",1)
  31. IF Num="1" THEN DO
  32.  Call Say("Inviting "IMNick" into conversation.",1)
  33.  Call Send2("CAL "TrID IMNick)
  34. End
  35. ELSE Call Say("Joined conversation successfully.",1)
  36. Call Say("",1)
  37. Call Say("To chat, simply type a message..",1)
  38. Call Say("To invite someone, type INVITE <Email>",1)
  39. Call Say("To cancel this conversation, type OUT",1)
  40. Call Say("",1)
  41.  
  42. DO FOREVER
  43.  IF RecvIM()>0 THEN DO
  44.   DO UNTIL RecvIM()="0"
  45.    IF IRCd~="1" THEN Parse Pull Line
  46.    L1=Upper(Word(Line,1))
  47.    SELECT
  48.     WHEN L1="OUT" THEN Call Send2(L1)
  49.     WHEN L1="INVITE" THEN DO
  50.      Call Say("Inviting "Word(Line,2)" into conversation")
  51.      Call Send2("CAL "TrID Word(Line,2))
  52.     End
  53.     OTHERWISE DO
  54.      Line=Algo(Line)
  55.      Call Send2("MSG "TrID" N "19+41+62+2+Length(Line))
  56.      Call Send2("MIME-Version: 1.0")
  57.      Call Send2("Content-Type: text/plain; charset=UTF-8")
  58.      Call Send2("X-MMS-IM-Format: FN=MS%20Sans%20Serif; EF=; CO=0; CS=0; PF=0")
  59.      Call Send2("")
  60.      Call Send(Sock,Line)
  61.     End
  62.    End
  63.   End
  64.  End
  65.  Call Recv2(1)
  66.  Call Delay(50)
  67.  IF Bytes>0 THEN DO UNTIL Bytes<0
  68.   Length=Length(Out)+2
  69.   Bytes=Bytes-Length
  70.   SELECT
  71.    WHEN W1="MSG" THEN DO
  72.     Len="0";Nick=W3
  73.     Chars=W4;TypUSR="0"
  74.     DO UNTIL Out=""
  75.      Call Recv2()
  76.      Len=Len+Length(Out)+2
  77.      Bytes=Bytes-(Length(Out)+2)
  78.      IF W1="TypingUser:" THEN TypUSR="1"
  79.     End
  80.     Chars=Chars-Len
  81.     drop MSG
  82.     Call Recv(Sock,MSG,Chars)
  83.     IF TypUSR="0" THEN DO
  84.      MSG=RemHex(MSG,2)
  85.      IF IRCd="1" THEN Call SendPIPE("Nick: "Chars IMNick,MSG)
  86.      ELSE Call Say(""RemHex(Nick,3)": "MSG)
  87.     End
  88.     Bytes=Bytes-Chars
  89.    End
  90.    WHEN W1="CAL" THEN NOP
  91.    WHEN W1="JOI" THEN DO
  92.     Call Say(RemHex(W3,3) "("W2") has joined this conversation",1)
  93.     IF IRCd="1"&Num="1"&W2=IMNick THEN Success="1"
  94.    End
  95.    WHEN W1="BYE" THEN DO
  96.     Call Say(W2 "has left this conversation",1)
  97.     IF IRCd="1"&W2=IMNick THEN Call Send2("OUT")
  98.    End
  99.    OTHERWISE Call ErrMsg("Recv: "Out)
  100.   End
  101.   Call Recv2(1)
  102.  End
  103. End
  104.  
  105. Recv2:
  106. Wait.Read.0 = Sock
  107. IF Arg(1)="" THEN Call WaitSelect("WAIT")
  108. Bytes=RecvLine(Sock,"Buf",1024)
  109. IF Bytes="0" THEN Call ErrMsg("Lost connection with "ServR,1)
  110. IF Arg(1)="1"&Bytes<0 THEN Return 0
  111. Out=Left(Buf,Length(Buf)-2)
  112. Parse Var Out W1" "W2" "W3" "W4" "W5" "W6" "W7
  113. Return 0
  114.  
  115. Send2:
  116. Request=Arg(1)""CR
  117. Call Send(Sock,Request)
  118. TrID=TrID+1
  119. Return 0
  120.  
  121. RecvIM:
  122. IF IRCd="1" THEN DO
  123.  IF Num="1"&Success~="1" THEN Len="0"
  124.  ELSE DO
  125.   Line=ReadLn(PIPE2)
  126.   Len=Length(Line)
  127.  End
  128. End
  129. ELSE Len=Lines()
  130. Return Len
  131.  
  132. Algo:
  133. Var=Arg(1)
  134. Vars=""
  135. DO i2=1 TO Length(Var)
  136.  Char=c2d(SubStr(Var,i2,1))
  137.  IF Char>192 THEN Char="Ã"d2c(Char-64)
  138.  ELSE IF Char>159&Char<192 THEN Char="Â"d2c(Char)
  139.  ELSE Char=d2c(Char)
  140.  Vars=Vars""Char
  141. End
  142. Return Vars
  143.  
  144. RemHex:
  145. Var=Arg(1)
  146. Vars=" à%"
  147. DO i2=1 TO Arg(2)
  148.  DO UNTIL Pos="0"
  149.   Pos=Pos(Word(Vars,i2),Var)
  150.   IF Pos>0 THEN DO
  151.    First=SubStr(Var,1,Pos-1)
  152.    Next=SubStr(Var,Pos+i2)
  153.    IF i2=1 THEN Char=""
  154.    IF i2=2 THEN Char=d2c(c2d(SubStr(Var,Pos+1,1))+64)
  155.    IF i2=3 THEN DO
  156.     Char=SubStr(Var,Pos+1,2)
  157.     IF Char="25" THEN DO
  158.      Char="%25";Pos="0"
  159.     End
  160.     ELSE Char=x2c(SubStr(Var,Pos+1,2))
  161.    End
  162.    Var=First""Char""Next
  163.   End
  164.  End
  165. End
  166. Return Var
  167.  
  168. ErrMsg:
  169. Call Say(Arg(1),Arg(2))
  170. IF Sock~="SOCK" THEN Call CloseSocket(Sock)
  171. IF IRCd="1" THEN DO
  172.  Call SendPIPE("Status: 0",RandNum)
  173.  DO UNTIL Out=""
  174.   Out=ReadLn(PIPE2)
  175.  End
  176.  Call Close(PIPE2)
  177. End
  178. ELSE DO
  179.  Call Say("Press enter to close window.")
  180.  Parse Pull
  181. End
  182. Exit
  183.  
  184. Say:
  185. IF IRCd~="1" THEN Call WriteLn(STDOUT,Arg(1))
  186. ELSE IF Arg(2)~="1" THEN Call SendPIPE("Nick: "Length(Arg(1))" AmiMSN",Arg(1))
  187. Return 0
  188.  
  189. SendPIPE:
  190. Call Open(PIPE,"PIPE:AmiMSN.tmp","W")
  191. Call WriteLn(PIPE,Arg(1))
  192. Call WriteLn(PIPE,Arg(2))
  193. Call Close(PIPE)
  194. Return 0
  195.  
  196. Syntax:
  197. Call ErrMsg("Command on line "SIGL" returned "RC" : "ErrorText(RC) SourceLine(SIGL))
  198. Exit
  199.